# 将需要配置的部分移出去，放到yaml文件里，走配置形式
# ---------
# ------
# ---


import os
import time
import requests
import json
import sys

# 获取项目文件路径
current_dir = os.path.dirname(__file__)
# 提取项目根路径
root_dir = os.path.abspath(os.path.join(current_dir, os.pardir))
# 将项目根路径存入，以便命令行运行时可以成功引包
sys.path.append(root_dir)

from handle_yaml import get_config
from 红妹妹审批.log import logger

# 随便写个，加一个报错，先停掉程序
11111阿萨大大



# 随便写个，加一个报错，先停掉程序
11111阿萨大大

# 获取当前文件路径，拼接json配置文件，生成路径，以供后面使用
path = os.path.dirname(__file__)
json_file_path = path + '/token.json'


# 获取最新token，完成token替换
def get_token():
    url = "http://zeus.corp.hongsong.club/portal/prod/api/login"

    payload = json.dumps({
        "username": username,
        "password": password
    })
    headers = {
        'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)

    token = response.json()['data']['token']

    # 读取token配置文件中的内容
    with open(json_file_path, 'r') as f:
        data = json.load(f)
    # 将获取到的接口的token，写入到data中
    data['token'] = token
    # 将data再次写入token文件，完成token的替换
    with open(json_file_path, 'w') as f1:
        f1.write(json.dumps(data))
    logger.log_info('token替换完成')


# 调用审核接口，传入需要审核的任务id
def check_approved(taskId):
    url = "http://zeus.corp.hongsong.club/portal/prod/api/approval/approved"

    payload = json.dumps({
        "taskId": taskId,
        "auditStatus": 2,
        "publishType": 2
    })
    headers = {
        'Authorization': token,
        'User-Agent': 'Apifox/1.0.0 (https://apifox.com)',
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    # print(response.text)
    logger.log_info(response.text)
    # 如果有如下返回，说明token失效，需要替换token文件中的token
    if response.json()['status']['des'] == '认证失效' and response.json()['status']['code'] == 100004:
        get_token()  # 替换token
        logger.log_info('替换完成，下一次执行生效')
    elif response.json()['status']['des'] == '成功':
        logger.log_info('审批完成')


# 获取服务的任务列表，传入多个服务名，将得到的data数据拼接起来返回
def get_Task_List(server_names):
    # 定义请求地址
    url = "http://zeus.corp.hongsong.club/portal/prod/api/deployTask/getTaskList"
    # 定义请求头
    headers = {
        'Authorization': token,
        'Content-Type': 'application/json'
    }
    # 定义存放数据的列表
    datas = []
    # 对入参的服务进行循环处理
    for server_name in server_names:
        # print(server_name)
        # 定义请求体，对服务名遍历
        payload = json.dumps({
            "appCode": server_name,
            "env": "test",  # 只要测试环境的
            "startIndex": 0,
            "pageSize": 5
        })
        try:
            # 请求接口
            response = requests.request("POST", url, headers=headers, data=payload)
        except requests.exceptions.RequestException as e:
            logger.log_info("请求接口发生错误:", e)
        except KeyError as e:
            logger.log_info("解析JSON数据发生错误:", e)
        except Exception as e:
            logger.log_info("发生未知错误:", e)
        try:
            # 获取响应中的data
            data = response.json()['data']
            # 利用extend方法，将数据加到datas末尾
            datas.extend(data)
        except Exception as e:  # 报错后兜底逻辑，随便给一个指定的datas。防止程序中断。
            logger.log_info(e)
            logger.log_info('解析数据出现错误------------------------------------------------')
            logger.log_info(response.text)
            datas = [
                {'creator': 'creator_name_test1', 'status': 'DONE', 'env': 'test', 'auditStatus': 2, 'scope': '测试'}]
        time.sleep(0.3)

    # 返回组装好的datas
    return datas


# 处理datas数据，进行审核
def handle_datas_to_examine(datas):
    for i in range(len(datas)):
        # 判断状态是未审核,且提交人是【xxx，xxx】creator
        # datas[i]['env'] == 'test' and
        if (datas[i]['status'] == 'PENDING'
                # and datas[i]['auditStatus'] == 0   接口里面这个字段去掉了
                and datas[i]['creator'] in creators):
            taskId = datas[i]['taskId']
            creator = datas[i]['creator']
            deployBranch = datas[i]['deployBranch']
            appCode = datas[i]['compileSchema']['appCode']
            scope = datas[i]['scope']

            logger.log_info('=====>准备审批，id是：%s,服务名：%s，分支：%s，提交人：%s，范围：%s' % (
                                taskId, appCode, deployBranch, creator, scope))
            # 执行审核操作
            check_approved(taskId)


if __name__ == '__main__':
    servers = get_config('servers')[0]  # 从配置文件读取需要监控的服务，以供下面使用
    creators = get_config('creators')[0]  # 从配置文件读取需要监控的服务，以供下面使用

    logger.log_info(f'{len(servers)}个服务{servers}')
    logger.log_info(f'{len(creators)}个用户{creators}')

    while True:
        username = get_config('username')  # 从配置文件读取用户名，以供下面使用
        password = get_config('password')  # 从配置文件读取密码，以供下面使用
        creators = get_config('creators')[0]  # 从配置文件读取需要监控的审批人，以供下面使用
        servers = get_config('servers')[0]  # 从配置文件读取需要监控的服务，以供下面使用

        # 获取配置文件中的token
        with open(json_file_path, 'r') as f:
            data = json.load(f)
        token = data['token']
        # 执行获取审批任务列表数据的方法
        datas = get_Task_List(servers)
        # 执行处理数据并审批的方法
        handle_datas_to_examine(datas)
        # 等待
        # time.sleep(10)
        # print(time.strftime('%Y-%m-%d %H:%M:%S'))
        logger.log_info('=_=')
